package jh.jianguan.springboot.test;


import java.util.Stack;

/**
 * @description: 使用两个栈实现消息队列
 * @author: guoc
 * @createDate: 2021/2/8 15:41
 */
public class Code_StackImplQueue<E>{

    Stack<E> stack_a=new Stack<>();
    Stack<E> stack_b=new Stack<>();


    /**
     * 每次push元素时都push到stack_a栈中
     * @return void
     * @author guoc
     * @date 2021/2/8 15:54
     */
    public void push(E e){
        stack_a.push(e);
    }


    /**
     * 出栈
     * @return E
     * @author guoc
     * @date 2021/2/8 15:54
     */
    public E pop(){

        /**
         * 如果stack_b为空，则需要把stack_a的元素全部弹出并push到stack_b中
         * @author guoc
         * @date 2021/2/8 15:55
         */
        if (stack_b.empty()){
            while (!stack_a.empty()){
                stack_b.push(stack_a.pop());
            }
        }

        /**
         * 如果stack_b还为空，则表示stack_a也为空，则直接返回null
         * @return E
         * @author guoc
         * @date 2021/2/8 15:55
         */
        if (stack_b.empty()){
            return null;
        }
        return stack_b.pop();
    }

    /**
     *
     *https://blog.csdn.net/CSDN_WYL2016/article/details/113730657?utm_medium=distribute.pc_category.none-task-blog-hot-3.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-3.nonecase&request_id=
     *实现原理
     *假设分别设添加元素的栈为：A，取元素的栈为：B。
     *每次数据都push到A栈中，当需要pop时，如果B栈为空，则一次性把用来A栈数据全部弹出并添加到B栈，否则直接从B栈弹出
     *
     */


    public static void main(String[] args) {
        Code_StackImplQueue code_stackImplQueue = new Code_StackImplQueue();
        code_stackImplQueue.push(1);
        code_stackImplQueue.push(2);
        code_stackImplQueue.push(3);
        System.out.println("pop"+code_stackImplQueue.pop()+","+code_stackImplQueue.pop()+","+code_stackImplQueue.pop());
    }




}
